package com.bing.server;

import com.bing.common.Message;
import com.bing.common.User;
import io.netty.channel.Channel;

import java.text.SimpleDateFormat;
import java.util.*;
import java.util.concurrent.ConcurrentHashMap;

/**
 * 用户管理类
 */
public class UserManager {
    
    // 单例模式
    private static final UserManager INSTANCE = new UserManager();
    
    // 用户信息，用户名 -> 用户对象
    private final Map<String, User> users = new ConcurrentHashMap<>();
    
    // 在线用户，用户名 -> 通道
    private final Map<String, Channel> onlineUsers = new ConcurrentHashMap<>();
    
    // 用户聊天记录，用户名 -> 消息列表
    private final Map<String, List<Message>> userMessages = new ConcurrentHashMap<>();
    
    private UserManager() {
        // 初始化一个管理员账号
        User admin = new User();
        admin.setId(UUID.randomUUID().toString());
        admin.setUsername("admin");
        admin.setPassword("admin");
        admin.setRegisterTime(getCurrentTime());
        users.put(admin.getUsername(), admin);
    }
    
    public static UserManager getInstance() {
        return INSTANCE;
    }
    
    /**
     * 注册用户
     */
    public boolean register(User user) {
        if (users.containsKey(user.getUsername())) {
            return false;  // 用户名已存在
        }
        user.setId(UUID.randomUUID().toString());
        user.setRegisterTime(getCurrentTime());
        users.put(user.getUsername(), user);
        return true;
    }
    
    /**
     * 用户登录
     */
    public boolean login(String username, String password, Channel channel) {
        User user = users.get(username);
        if (user == null || !user.getPassword().equals(password)) {
            return false;  // 用户名或密码错误
        }
        
        // 已经在线
        if (onlineUsers.containsKey(username)) {
            return false;
        }
        
        user.setOnline(true);
        onlineUsers.put(username, channel);
        return true;
    }
    
    /**
     * 用户登出
     */
    public void logout(String username) {
        User user = users.get(username);
        if (user != null) {
            user.setOnline(false);
            onlineUsers.remove(username);
        }
    }
    
    /**
     * 保存聊天记录
     */
    public void saveMessage(Message message) {
        String sender = message.getSender();
        if (!userMessages.containsKey(sender)) {
            userMessages.put(sender, new ArrayList<>());
        }
        userMessages.get(sender).add(message);
    }
    
    /**
     * 获取用户历史聊天记录
     */
    public List<Message> getUserHistory(String username) {
        return userMessages.getOrDefault(username, new ArrayList<>());
    }
    
    /**
     * 修改用户信息
     */
    public boolean updateUserInfo(String username, String newUsername, String newPassword) {
        User user = users.get(username);
        if (user == null) {
            return false;
        }
        
        // 如果修改用户名且新用户名已存在
        if (!username.equals(newUsername) && users.containsKey(newUsername)) {
            return false;
        }
        
        if (!username.equals(newUsername)) {
            // 更新用户名
            User updatedUser = users.get(username);
            updatedUser.setUsername(newUsername);
            
            // 更新消息记录映射
            List<Message> messages = userMessages.remove(username);
            if (messages != null) {
                userMessages.put(newUsername, messages);
            }
            
            // 更新在线用户映射
            Channel channel = onlineUsers.remove(username);
            if (channel != null) {
                onlineUsers.put(newUsername, channel);
            }
            
            // 移除旧用户并添加新用户
            users.remove(username);
            users.put(newUsername, updatedUser);
        }
        
        // 更新密码
        if (newPassword != null && !newPassword.isEmpty()) {
            User updatedUser = users.get(newUsername != null && !newUsername.isEmpty() ? newUsername : username);
            updatedUser.setPassword(newPassword);
        }
        
        return true;
    }
    
    /**
     * 获取在线用户列表
     */
    public List<String> getOnlineUserList() {
        return new ArrayList<>(onlineUsers.keySet());
    }
    
    /**
     * 获取在线用户数量
     */
    public int getOnlineUserCount() {
        return onlineUsers.size();
    }
    
    /**
     * 获取所有用户信息
     */
    public List<User> getAllUsers() {
        return new ArrayList<>(users.values());
    }
    
    /**
     * 获取所有在线用户的通道
     */
    public Collection<Channel> getAllChannels() {
        return onlineUsers.values();
    }
    
    /**
     * 获取当前时间
     */
    private String getCurrentTime() {
        SimpleDateFormat sdf = new SimpleDateFormat("yyyy-MM-dd HH:mm:ss");
        return sdf.format(new Date());
    }
} 